package com.shiguiwu.springmybatis.netty.simple.handler;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.CharsetUtil;
import lombok.extern.slf4j.Slf4j;

/**
 * @description: netty 服务处理器
 * 自定义个server handler 一定要继承自 ChannelInboundHandlerAdapter
 * @author: stone
 * @date: Created by 2021/12/2 22:05
 * @version: 1.0.0
 * @pakeage: com.shiguiwu.springmybatis.netty.simple.handler
 */
@Slf4j
public class NettyServiceHandler extends ChannelInboundHandlerAdapter {


    /**
     * 读取数据事件 - 这里我们可以读取到客服端发来的数据
     * @param ctx 上下文对象，包含很多信息，比如管道pipeline ,通道channel ,地址等
     * @param msg 消息实体，也就是客户端发送的消息对象
     * @throws Exception e
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {

        //实际上 msg是一个buffer
        ByteBuf byteBuf = (ByteBuf) msg;
        log.info("客户端发来消息是 ===>  {}" , byteBuf.toString(CharsetUtil.UTF_8));
        log.info("客户端地址是 ===>{}" ,ctx.channel().remoteAddress());
    }

    /**
     * 读取完毕后的操作后，发送给客户端的消息
     *
     * @param ctx 上下文对象
     * @throws Exception e
     */
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {

        //写入数据并刷新缓存，然后发送给客户端
        ctx.writeAndFlush(Unpooled.copiedBuffer("hello,client maimai".getBytes(CharsetUtil.UTF_8)));
    }

    /**
     *  出异常的时候，关闭通道
     * @param ctx 上下文对象
     * @param cause e
     * @throws Exception e
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        log.error("通道发生异常 ===> {}", cause.getMessage());
        ctx.close();
    }
}
